package br.ufal.ic.p3.darv10.visao;

import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

import javax.swing.JLabel;
import javax.swing.JButton;

import br.ufal.ic.p3.darv10.controlador.Controlador;
import br.ufal.ic.p3.darv10.dominio.Aluno;
import br.ufal.ic.p3.darv10.dominio.Disciplina;
import br.ufal.ic.p3.darv10.dominio.Secretaria;
import br.ufal.ic.p3.darv10.excecao.DARExcecao;


public class InterfaceGrafica extends JFrame implements ActionListener, ItemListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JComboBox comboAlunos;
	private JComboBox comboDisciplinas;
	private JComboBox comboAlunosConsulta;
	private JComboBox comboConsultaAlunosDisciplina;
	private JButton bConsultar;
	private Controlador controlador;
	private JPanel painelUp;
	private JPanel painelDown;
	private JButton bMatricular;
	private JLabel lAlunos;
	private JLabel lDisciplinas;
	private JTabbedPane tPane;
	private JLabel consultAlunoNome;
	private JLabel consultMatriculaAluno;
	private JComboBox consultSecDisciplina;
	private JComboBox consultDisSec;
	private JComboBox consultDiscAluno;
	private JComboBox consultAlunoDisc;
	private JButton consultarB1;
	private JLabel lcodDisciplina;
	private JLabel lnumCreditos;
	private JLabel lcodPreRequisito;
	private JLabel lnumCredMin;
	private JLabel lcodDisciplina2;
	private JLabel lnumCreditos2;
	private JLabel lcodPreRequisito2;
	private JLabel lnumCredMin2;
	private JButton consultarB2;
	private JLabel lAluno;
	private JLabel nomeProfessor;
	
	private void iniciarObjetos() throws DARExcecao{
		
		controlador = new Controlador(this);
		
		painelUp = new JPanel();
		lAluno = new JLabel("Aluno:");
		lAlunos = new JLabel("Alunos:");
		lDisciplinas = new JLabel("Disciplinas:");
		bMatricular = new JButton("Matricular");
		comboConsultaAlunosDisciplina = new JComboBox();
		comboDisciplinas = new JComboBox();
		comboAlunos = new JComboBox(controlador.getTodosAlunos().toArray());
		comboAlunosConsulta = new JComboBox(controlador.getTodosAlunos().toArray());
		bConsultar = new JButton("Consultar");
		consultAlunoNome = new JLabel("Nome do Aluno:");
		consultMatriculaAluno = new JLabel("Código do Aluno:");
		tPane = new JTabbedPane();
		painelDown = new JPanel();
		consultSecDisciplina = new JComboBox(controlador.getTodasSecretarias().toArray());
		consultDisSec = new JComboBox();
		consultAlunoDisc = new JComboBox();
		consultDiscAluno = new JComboBox(controlador.getTodasDisciplinas().toArray());
		
		consultarB1 = new JButton("Ver Dados");
		consultarB2 = new JButton("Ver Dados");
		
		lcodDisciplina = new JLabel();
		lnumCreditos = new JLabel();
		lcodPreRequisito = new JLabel();
		lnumCredMin = new JLabel();
		
		lcodDisciplina2 = new JLabel();
		lnumCreditos2 = new JLabel();
		lcodPreRequisito2 = new JLabel();
		lnumCredMin2 = new JLabel();
		
		nomeProfessor = new JLabel();
	}


	public void iniciarGUI() throws DARExcecao{

		iniciarObjetos();

		setTitle("Diretoria de Admissão e Registro");
		painelUp.setLayout(new FlowLayout());	
		comboAlunos.addItemListener(this);

		painelUp.add(lAlunos);
		painelUp.add(comboAlunos);
		painelUp.add(lDisciplinas);
		painelUp.add(comboDisciplinas);

		bMatricular.addActionListener(this);

		painelUp.add(bMatricular);

		//PanelDown
		JComponent panel1 = makePanel(2,3);
		JComponent panel2 = makePanel(3,3);
		JComponent panel3 = makePanel(3,3);

		tPane.addTab("Consultar Disciplinas Por Aluno", panel1);
		tPane.addTab("Consultar Disciplinas Por Secretaria", panel2);
		tPane.addTab("Dados Sobre as Disciplinas", panel3);
		tPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

		painelDown.setLayout(new BorderLayout());

		//Painel 1
		panel1.add(lAluno);
		panel1.add(comboAlunosConsulta);
		panel1.add(bConsultar);
		panel1.add(consultAlunoNome);
		panel1.add(consultMatriculaAluno);
		panel1.add(lcodDisciplina2);
		panel1.add(comboConsultaAlunosDisciplina);
		panel1.setSize(new Dimension(500,500));

		//Painel 2
		panel2.add(consultSecDisciplina);
		panel2.add(consultDisSec);
		panel2.add(consultarB1);
		panel2.add(lcodDisciplina);
		panel2.add(lnumCreditos);
		panel2.add(lcodPreRequisito);
		panel2.add(lnumCredMin);
		
		//Painel 3	
		panel3.add(consultDiscAluno);
		panel3.add(consultAlunoDisc);
		panel3.add(consultarB2);
		panel3.add(lcodDisciplina2);
		panel3.add(lnumCreditos2);
		panel3.add(lcodPreRequisito2);
		panel3.add(lnumCredMin2);
		panel3.add(nomeProfessor);

		bConsultar.addActionListener(this);
		comboConsultaAlunosDisciplina.addActionListener(this);
		consultSecDisciplina.addItemListener(this);
		consultDiscAluno.addItemListener(this);
		consultarB1.addActionListener(this);
		consultarB2.addActionListener(this);
		
		painelDown.add(tPane, -1);

		painelUp.add(painelDown, -1);
		
		//Adicionar no JFrame
		add(painelUp);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800,600);
		//setResizable(false);
		setVisible(true);
	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		if(e.getSource() == comboAlunos){
			comboDisciplinas.removeAllItems();
			for(Disciplina d : controlador.getTodasDisciplinasPorAluno((Aluno)comboAlunos.getSelectedItem())){
				comboDisciplinas.addItem(d);
			}
		}
		if(e.getSource() == consultSecDisciplina){
			consultDisSec.removeAllItems();
			for(Disciplina d : controlador.getTodasDisciplinasSecretaria((Secretaria)consultSecDisciplina.getSelectedItem())){
				consultDisSec.addItem(d);
			}
		}
		if(e.getSource() == consultDiscAluno){
			consultAlunoDisc.removeAllItems();
			for(Aluno a : controlador.getTodosAlunosDis(((Disciplina)consultDiscAluno.getSelectedItem()))){
				consultAlunoDisc.addItem(a);
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == bMatricular) {
			String mensagem = controlador.matricularAluno((Aluno)comboAlunos.getSelectedItem(),(Disciplina) comboDisciplinas.getSelectedItem());
			JOptionPane.showMessageDialog(null,mensagem, "Matricula", 1);
		}
		if(e.getSource() == bConsultar){
			consultAlunoNome.setText("Nome do Aluno: " + ((Aluno) comboAlunosConsulta.getSelectedItem()).getNomeAluno() + "     ");
			consultMatriculaAluno.setText("Código do Aluno: "+ ((Aluno) comboAlunosConsulta.getSelectedItem()).getMatriculaAluno());
			comboConsultaAlunosDisciplina.removeAllItems();
			for(Disciplina d : controlador.getDisciplinasMatriculadas((Aluno)comboAlunosConsulta.getSelectedItem())){
				comboConsultaAlunosDisciplina.addItem(d.getCodigoDisciplina() + "  "+ d.getNomeDisciplina());
			}
		}
		if(e.getSource() == consultarB1){
			lcodDisciplina.setText("");
			lnumCreditos.setText("");
			lcodPreRequisito.setText("");
			lnumCredMin.setText("");
			
			lcodDisciplina.setText("Código: " + lcodDisciplina.getText() + " " + controlador.getCodigoDisciplina((Disciplina)consultDisSec.getSelectedItem()));
			lnumCreditos.setText("Núm. Créditos: " + lnumCreditos.getText() + " " + controlador.getCreditoDisciplina((Disciplina)consultDisSec.getSelectedItem()));
			lcodPreRequisito.setText("Cód. Pré-Requisito: " + lcodPreRequisito.getText() + " " + controlador.getCodPreReqDisciplina((Disciplina)consultDisSec.getSelectedItem()));
			lnumCredMin.setText("Núm. Créditos Mínimos: " + lnumCredMin.getText() + " " + controlador.getNumCredMinDisciplina((Disciplina)consultDisSec.getSelectedItem()));
		}
		
		if(e.getSource() == consultarB2){
			lcodDisciplina2.setText("");
			lnumCreditos2.setText("");
			lcodPreRequisito2.setText("");
			lnumCredMin2.setText("");
			nomeProfessor.setText("");
			
			lcodDisciplina2.setText("Código: " + lcodDisciplina2.getText() + " " + controlador.getCodigoDisciplina((Disciplina)consultDiscAluno.getSelectedItem()));
			lnumCreditos2.setText("Núm. Créditos: " + lnumCreditos2.getText() + " " + controlador.getCreditoDisciplina((Disciplina)consultDiscAluno.getSelectedItem()));
			lcodPreRequisito2.setText("Cód. Pré-Requisito: " + lcodPreRequisito2.getText() + " " + controlador.getCodPreReqDisciplina((Disciplina)consultDiscAluno.getSelectedItem()));
			lnumCredMin2.setText("Núm. Créditos Mínimos: " + lnumCredMin2.getText() + " " + controlador.getNumCredMinDisciplina((Disciplina)consultDiscAluno.getSelectedItem()));
			nomeProfessor.setText("Professor: "+ nomeProfessor.getText() + " " + controlador.getProfessorDisc((Disciplina)consultDiscAluno.getSelectedItem()));
		}
	}

	public JComponent makePanel(int l, int c) {
		JPanel panel = new JPanel(false);
		panel.setLayout(new GridLayout(l,c));
		return panel;
	}
}